#include <bits/stdc++.h>
using namespace std;
using uint=unsigned int;
using ll=long long;
using ull=unsigned long long;
using i128=__int128;
const int N=1e6+5;

void solve() {
    ll l,r;
    scanf("%lld%lld",&l,&r);
    for(ll i=1;(l|i)<=r;(i<<=1ll))l|=i;
    printf("%lld\n",l);
    return;
}

int main() {
    int n;
    scanf("%d",&n);
    while(n--)solve();


    return 0;
}

//我的代码，超时
// vector<ll> solve(ll sta) {
//   vector<ll> one(sta+1,0);
//   for (int i=0;i<=sta;i++) {
//     one[i]=one[i>>1]+(i&1);
//   }
//   return one;
// }
//
// int main(){
//   int n;
//   cin>>n;
//   vector<pair<ll,ll>> v(n);
//   ll sta=0;
//   for(int i=0;i<n;i++){
//     scanf("%lld%lld",&v[i].first,&v[i].second);
//     sta=max(sta,v[i].second);
//   }
//   vector<ll> one=solve(sta);
//   for(int i=0;i<n;i++) {
//     ll maxn=0;
//     ll index=v[i].second;
//     for(ll j=v[i].second;j>=v[i].first;j--){
//       ll cnt=one[j];
//       if(cnt>=maxn){
//         maxn=cnt;
//         index=j;
//       }
//     }
//     printf("%lld\n",index);
//   }
//
//   return 0;
// }
//荣智的代码
// #include <bits/stdc++.h>
// #define endl "\n"
// // using namespace std;
//
// using uint = unsigned int;
// using ll = long long;
// using ull = unsigned long long;
// using i128 = __int128;
//
// const int N = 1e6 + 5;
//
// void Solve(){
//   ll l, r;
//   scanf("%lld%lld", &l, &r);
//   for(ll i = 1; (l|i) <= r; (i <<= 1LL)) l |= i;
//   printf("%lld\n", l);
//   return ;
// }
//
// int main(){
//   // std::ios::sync_with_stdio(false);
//   // std::cin.tie(nullptr);
//   int T = 1;
//   scanf("%d", &T);
//   // std::cin >> T;
//   while(T--) Solve();
//   return 0;
// }

//我们将非负整数x的二进制表示中设置的位数（'1'位）表示为。
//
//给定多个查询，每个查询由整数对l和r组成。对于每个查询，找到x，使得l ≤ x ≤ r，并且尽可能大。如果存在多个这样的数字，请找到其中最小的。
//
//输入
//第一行包含整数n — 查询的数量（1 ≤ n ≤ 10000）。
//
//接下来的n行中，每行包含两个整数li, ri — 对应查询的参数（0 ≤ li ≤ ri ≤ 1018）。
//
//输出
//对每个查询，单独打印答案。
//
//示例1
//Inputcopy	Outputcopy
// 3
// 1 2
// 2 4
// 1 10
//1
//3
//7